/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.sx.sx1.lintcode.day717;

import java.util.*;

/**
 *
 * @author Administrator
 */
public class LC236 {

    //有问题
    static class Solution {

        /*
     * @param x: An integer
     * @return: An integer
         */
        public int swapOddEvenBits(int x) {
            // write your code here
            boolean fushu = x < 0 ? true : false;

            int[] arr = new int[32];
            for (int i = 31; i >= 0; i--) {
                int cur = (x & (1 << i)) == 0 ? 0 : 1;
                arr[i] = cur;
            }

            int ans = 0;
            for (int i = 0; i <= 30; i += 2) {
                int a = arr[i];
                int b = arr[i + 1];
                ans += ((int) Math.pow(2, i)) * b;

                ans += ((int) Math.pow(2, i + 1)) * a;
            }
            System.out.println(fushu + " ：  " + x + " => " + ans + "  ");
            if (fushu) {

                return ans + 1;

            }
            return ans;
        }
    }

    public static void main(String[] args) {
        Solution obj = new Solution();
        System.out.println(obj.swapOddEvenBits(0));
        System.out.println(obj.swapOddEvenBits(5));
        System.out.println(obj.swapOddEvenBits(-2));
        System.out.println(obj.swapOddEvenBits(1534236469));
    }

    public static int swapOddEvenBits(int x) {
        //int ou = x & 0xaaaaaaaa; // 和1010 1010 1010……做与运算取出偶数位
        //int ji = x & 0x55555555; // 和0101 0101 0101……做与运算取出奇数位
        return f1(x);
        //return (ou >>> 1) ^ (ji << 1);
    }

    public static int f1(int x) {
        List<Integer> ou_list = new ArrayList<>();
        List<Integer> ji_list = new ArrayList<>();
        for (int i = 0; i < 32; i++) {
            ou_list.add(i % 2 == 0 ? 1 : 0);
            ji_list.add(i % 2 == 1 ? 1 : 0);
        }

        long ou_num = 0, ji_num = 0;
        int pow = 0;
        for (int i = 31; i >= 0; i--) {
            ou_num += ou_list.get(i) * (long) (Math.pow(2, pow));
            ji_num += ji_list.get(i) * (long) (Math.pow(2, pow));
            pow++;
        }

        long a = x & ou_num;
        long b = x & ji_num;
        long ans = (a >>> 1) ^ (b << 1);

        return (int) ans;
    }

}

/*
  // write your code here
        int[] arr = new int[32];
        for(int i=31;i>=0;i--){
            int cur = (x&(1 << i) )== 0?0 :1;
            arr[i] = cur;
        }
        
       int ans =0;
       for(int i=0;i<=30;i+=2){
           int a = arr[i];
           int b = arr[i+1];
           ans += ((int)Math.pow(2,i)) * b;
           
         ans+= ((int)Math.pow(2,i+1))*a;
       }
        return ans;
 */

 /*
输入数据
1534236469
输出数据
-1481544903
期望答案
-1481544902

LintCode-Logo
搜索题目、标签、题集
中文
avatar
您有169条未读消息，请及时查看
236 · 交换奇偶二进制位
算法
简单
通过率
44%

题目
题解7
笔记
讨论43
排名
记录
描述
设计一个方法，用尽可能少的指令，将一个整数中奇数数位和偶数数位的数字交换 （如，数位 0 和数位 1 交换，数位 2 和数位 3 交换，等等）。

最短时间刷“透”算法面试：《66页算法宝典》.pdf

微信添加【jiuzhangfeifei】备注【66】领取


样例
样例 1：

输入：0
输出：0
解释：
0 = 0(2) -> 0(2) = 0
样例 2：

输入：5
输出：10
解释：
5 = 101(2) -> 1010(2) = 10
标签
相关题目

658
交换不借助额外变量(仅C++)
简单

721
下一个稀疏数
困难

723
左旋转二进制位
中等

987
具有交替位的二进制数
简单
推荐课程

系统设计 System Design 2024版
数据库、API、GFS、视频流等16大系统设计详解，实战练习拿下面试/晋升“拦路虎”
232/3307
已开启智能提示
发起考试
15 分 00 秒
123456789
public class Solution {
    /*
     * @param x: An integer
     * @return: An integer
     
    public int swapOddEvenBits(int x) {
        // write your code here
    }
控制台
历史提交

 */
